package com.itheima.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * 因为不确定这个具体是哪个层的  所以需要使用@Component注解
 * <p>
 * 需要连接   不可避免的会遇到dataSource  所以需要注入数据源
 * <p>
 * 1 提供一个方法  返回一个连接
 * 为了连接的线程安全性   所以使用ThreadLocal线程的方式进行创建
 * <p>
 * 2 提供一个提交并关闭连接的放方法
 * <p>
 * 3 提供一个回滚并且关闭连接的方法
 */

@Component
public class MyConnection {

    /**
     * @DataSource 注入数据源
     */
    @Autowired
    private DataSource dataSource;

    //创建一个本地线程的对象
    /**
     * ThreadLocal  创建一个本地的此线程对象
     */
    private ThreadLocal<Connection> local = new ThreadLocal<>();

    //提供一个获取连接的方法
    public Connection getConnection() throws SQLException {
        //如果本地有的话  那么就直接获取
        Connection connection = local.get();

        // 如果没有的话  那么在创建一个线程
        //判断connection是否为空
        if (connection == null) {
            connection = dataSource.getConnection();
            //关闭事务的自动提交
            connection.setAutoCommit(false);
            //将创建的连接放入线程中
            local.set(connection);
        }
        return connection;
    }


    public void commitAndClose() {
        try {
            Connection connection = getConnection();
            connection.commit();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void rollbackAndClose() {
        try {
            Connection connection = getConnection();
            connection.rollback();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
